package com.xrh.xdemo.service.xss;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HtmlUtil;
 

/**
 * 参考 : https://blog.csdn.net/yuechuzhixing/article/details/132204075
 * @function 防xss攻击的request包装器, 对所有html特殊字符进行转义
 * @author 肖荣辉
 * @date 2023年12月22日
*/
public class XSSHttpServletRequestWrapper extends HttpServletRequestWrapper {
 
    private HttpServletRequest request;
    
    
    public XSSHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
        this.request = request;
    }
 
    /**
	 * @function 链接上的参数也要进行转义
	 * @author 肖荣辉
	 * @date 2023年12月22日
	*/
    @Override
    public String getQueryString() {
        return HtmlUtil.escape(super.getQueryString());
    }
 
    /**
	 * @function 获取参数的方法要进行html转义
	 * @author 肖荣辉
	 * @date 2023年12月22日
	*/
    @Override
    public String getParameter(String name) {
    	
        String parameter = request.getParameter(name);
        
        if (StrUtil.isNotBlank(parameter)) {
            parameter = HtmlUtil.escape(parameter);
        }
        
        return parameter;
    }
 
    /**
	 * @function 获取参数的方法要进行html转义
	 * @param name
	 * @author 肖荣辉
	 * @date 2023年12月22日
	*/
    @Override
    public String[] getParameterValues(String name) {
    	
        String[] parameterValues = request.getParameterValues(name);
        
        for(int i = 0 ; parameterValues != null && i < parameterValues.length ; i ++ ) {
        	 parameterValues[i] = HtmlUtil.escape(parameterValues[i]); 
        }
        
        
        return parameterValues;
    }
 
    /**
	 * @function 所有参数值都进行转义
	 * @author 肖荣辉
	 * @date 2023年12月22日
	*/
    @Override
    public Map<String, String[]> getParameterMap() {
    	
        Map<String, String[]> map = request.getParameterMap();
        
        if(MapUtil.isEmpty(map))
        	return map;
        
        for (String[] value : map.values()) {
        	
            for (String str : value) {
                str = HtmlUtil.escape(str);
            }
            
        }
        
        return map;
    }
 
    /*重写输入流的方法，因为使用RequestBody的情况下是不会走上面的方法的*/
    @Override
    public BufferedReader getReader() throws IOException {
        return new BufferedReader(new InputStreamReader(getInputStream()));
    }
 
}